package juego.armas.proyectiles;
import java.util.Iterator;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;

import basicas.Posicion;
import juego.IDestruible;
import juego.IMovil;
import juego.ObjetoDelJuego;
import juego.enums.*;

public abstract class Proyectil extends ObjetoDelJuego implements IMovil { 
	private tipoMovimiento direccion;
	private int movimientosRestantes;
	private double velocidadMovimiento;
	private int danio;
	private int disparadorId;
	
	public Proyectil(Posicion posicionInicial, tipoMovimiento direccionInicial, int disparadorId) {
		super(posicionInicial);
		direccion = direccionInicial;
		this.disparadorId = disparadorId;
	}
	
	public Proyectil(Node n) {
		super(n);
		for (int i = 0; i < n.getChildNodes().getLength(); i++) {
			Node child = n.getChildNodes().item(i);
			if (child.getNodeName().equals("direccion")) {
				if (child.getTextContent().equals("arriba")) {
					setDireccion(tipoMovimiento.arriba);
				} else if (child.getTextContent().equals("abajo")) {
					setDireccion(tipoMovimiento.abajo);
				} else if (child.getTextContent().equals("derecha")) {
					setDireccion(tipoMovimiento.derecha);
				} else if (child.getTextContent().equals("izquierda")) {
					setDireccion(tipoMovimiento.izquierda);
				}			
			} else if (child.getNodeName().equals("velocidadMovimiento")) {
				setVelocidadMovimiento(Double.parseDouble(child.getTextContent()));
			}
		}
	}
	
	public void mover(tipoMovimiento direccion) {
		//setMovimientosRestantes((int)(1/getVelocidadMovimiento()));
		movimientosRestantes = (int)(1/getVelocidadMovimiento());
	}

	@Override
	public void avanzar() {
		switch(direccion) {
			case arriba: getPosicion().mover(0, getVelocidadMovimiento() * -1); break;
			case abajo: getPosicion().mover(0, getVelocidadMovimiento()); break;
			case derecha: getPosicion().mover(getVelocidadMovimiento(), 0); break;
			case izquierda: getPosicion().mover(getVelocidadMovimiento() * -1, 0); break;
		}
		movimientosRestantes = movimientosRestantes - 1;		
	}

	@Override
	public void centrar() {
		getPosicion().centrar();
	}

	public int getMovimientosRestantes() {		
		return 1;
	}

	/*public void setMovimientosRestantes(int cantidad) {
		movimientosRestantes = cantidad;
	}*/

	@Override
	public double getVelocidadMovimiento() {		
		return velocidadMovimiento;
	}

	public void setVelocidadMovimiento(double velocidad) {
		if (velocidad < 1)
			velocidadMovimiento = velocidad;
	}

	public boolean puedoMover(tipoMovimiento direccion) {
		return true;
	}

	public void vivir() {	
		this.avanzar();
		if (getNivel().getTablero().dentroLimites(getPosicion()) == false) {
			morir();
		} else {
			ObjetoDelJuego o = buscarColision();		
			if (o != null) {
				// Si colisiono contra alguno objeto, le hago danio.
				if (o instanceof IDestruible || o instanceof Proyectil) {
					if (o instanceof IDestruible) {
						producirDanio((IDestruible)o);
						// Si el que lo habia disparado es el algoTank, tengo que sumar puntos.
						if (disparadorId == getNivel().getAlgoTank().getId()) {							
							getNivel().sumarPuntos(producirDanio((IDestruible)o));
						}
					}
					morir();
				}					
			} 
		}		
	}
	
	public int producirDanio(IDestruible o) {
		return o.recibirDanio(getDanio());		
	}

	public tipoMovimiento getDireccion() {
		return direccion;
	}
	
	public void setDireccion(tipoMovimiento direccion) {
		this.direccion = direccion;		
	}
	
	public void informarPosicion() {		
		
	}
	
	public ObjetoDelJuego buscarColision() {
		Iterator<ObjetoDelJuego> it;
		it = getNivel().getObjetos().iterator();
		ObjetoDelJuego o;
		ObjetoDelJuego objetoColision = null;
		while(it.hasNext() && objetoColision == null) {
			o = it.next();
				if (o.getPosicion().Distancia(getPosicion()) < 0.5 	// Calculo la distancia al objetivo. 
					&& o.getId() != getId()							// Verifico que no sea el mismo.
					&& o.getId() != disparadorId) {					// Y que no sea el que disparo.
				objetoColision = o;
			}
		}
		return objetoColision;
	}

	public int getDanio() {
		return danio;
	}

	public void setDanio(int danio) {
		this.danio = danio;
	}
	
	public Element getElemento(Document doc) {		
		Element nuevoNodo;
		Element nodoHijo;
		
		nuevoNodo = super.getElemento(doc);	

		nodoHijo = doc.createElement("direccion");
		nuevoNodo.appendChild(nodoHijo);
		nodoHijo.setTextContent(direccion.name());		

		nodoHijo = doc.createElement("movimientosRestantes");
		nuevoNodo.appendChild(nodoHijo);
		nodoHijo.setTextContent(String.valueOf(movimientosRestantes));		
		
		nodoHijo = doc.createElement("velocidadMovimiento");
		nuevoNodo.appendChild(nodoHijo);
		nodoHijo.setTextContent(String.valueOf(velocidadMovimiento));		

		
		return nuevoNodo;
	}
}
